Yocto Project

Yocto Project
Buildroot가 할 수 있는 툴체인, 부트로더, 커널, 루트 파일 시스템을 빌드할 수 있으며,
런타임에 설치될 수 있는 바이너리 패키지와 전체 리눅스 배포를 생성할 수 있다.

Yocto Project는 레시피(buildroot의 패키지)로 구성한 것을 만드는 BitBake와 테스크 스케줄러, 파이썬, 셸 스크립트로 구동
- OE-Core: OpenEmbedded와 공유하는 코어 메타 데이터
- BitBake: OpenEmbedded 및 기타 프로젝트와 공유하는 태스크 스케쥴러
- Poky: 레퍼런스 배포판
- Documentation: 사용자 설명서와 각 컴포넌트에 대한 개발자 지침
- Toaster: BitBake와 그 메타데이터를 위한 웹 기반 인터페이스
- ADT Eclispe: 이클립스 플러그인
git clone -b kirkstone git://git.yoctoproject.org/poky.git
https://wiki.yoctoproject.org/wiki/Releases
config
cd poky
source oe-init-build-env
중간 생성 파일, 타깃 이미지 파일은 모두 poky/build/에 저장
(oe-init-build-env에 매개변수로 원하는 디렉토리 전달 가능)

┌──(csian㉿csian)-[~/poky/build/conf]

└─$ ls -al

total 28

drwxr-xr-x 2 csian csian  4096 Mar  2 20:15 .

drwxr-xr-x 3 csian csian  4096 Mar  2 20:15 ..

-rw-r--r-- 1 csian csian   283 Mar  2 20:15 bblayers.conf

-rw-r--r-- 1 csian csian 11885 Mar  2 20:15 local.conf

-rw-r--r-- 1 csian csian    15 Mar  2 20:15 templateconf.cfg

local.conf: 빌드하려고 하는 장치의 스펙과 빌드환경 설정
bblayers.conf: 사용하는 메타 레이어의 패스
templateconf.cfg: 다양한 conf 파일을 포함하는 디렉토리 이름을 저장(default: meta-poky/conf)
Build
빌드하기 위해 루트 파일 시스템 이미지를 알려주면서 BitBake를 실행
- core-image-minimal: 작은 콘솔 기반 시스템
- core-image-minimal-initramfs: core-image-minimal과 비슷하나 램 디스크로 빌드
- core-image-x11: X11 서버와 x터미널 앱을 통한 그래픽 지원용 기본 이미지
- core-image-sato: Sato 기반의 풀 그래픽 시스템(X11+GNOME에 빌드된 모바일 그래픽 환경)
    sato 이미지는 터미널, 에디터, 파일 관리자를 포함한 다양한 앱 포함
ex) core-image-minimal

└─$ which bitbake

/home/csian/poky/bitbake/bin/bitbake

bitbake core-image-minimal
poky/build/downloads    : 내려 받는 소스 코드(~4GiB)
                    /tmp : 대부분의 빌드 결과물 저장
                        /work : 빌드 디렉토리와 루트 파일시스템을 위한 스테이징 영역 포함
                        /deploy : 타깃 배포를 위한 최종 바이너리 포함
                            /images/[machine_name] : 타깃에 실행되기 위해 준비된 부트로더 커널과 루트 파일시스템 이미지를 포함
                            /rpm : 이미지를 구성했던 RPM 패키지 포함
                            /licenses : 각 패키지에서 추출된 라이선스 파일들 포함
Layer
Yocto Project의 메타 데이터는 레이어로 구성되어 있다.(meta*)

└─$ ls -d meta* 

meta  meta-poky  meta-selftest  meta-skeleton  meta-yocto-bsp


- meta: Poky용으로 약간 수정된 OpenEmbedded의 코어

- meta-poky: Poky 배포판에 해당하는 메타 데이터

- meta-yocto-bsp: Yocto Project가 지원하는 머신에 대한 BSP(Board Support Packages)를 포함


http://layers.openembedded.org/layerindex/branch/master/layers/

필요한 레이어를 적절한 위치(meta* 디렉토리)에 저장하고, /build/conf/bblayers.conf에 추가

┌──(csian㉿csian)-[~/poky/build/conf]

└─$ cat bblayers.conf 

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf

# changes incompatibly

POKY_BBLAYERS_CONF_VERSION = "2"


BBPATH = "${TOPDIR}"

BBFILES ?= ""


BBLAYERS ?= " \

  /home/csian/poky/meta \

  /home/csian/poky/meta-poky \

  /home/csian/poky/meta-yocto-bsp \

  "


각 레이어는 최소 하나의 구성 파일 conf/layers.conf, README, 라이선스등을 포함해야 함

cd ~/poky
scripts/yocto-layer create <meta name> # layer
Process Examples
cd ~/poky
source oe-init-build-env build-nova # build-nova build output
bitbake-layers add-layer ../meta-nova # layer
bitbake-layers show-layers # layer
Recipe & Bitbake
- Recipes(*.bb): 소스코드의 사본과 다른 컴포넌트와의 의존관계, 빌드 및 설치 방법을 포함한 소프트웨어 유닛의 빌드 정보
- Append(*.bbappend): 레시피의 세부 내용을 덮어씌우거나 확장하게 해줌(일반적으로 *.bb 뒤에 첨가되는 명령)
- Include(*.inc): 정보가 레시피들 사이에서 공유될 수 있도록 함(include or require 키워드로 포함)
- Classes(*.bbclass): 공통 빌드 정보를 포함(inherit 키워드를 이용해 레시피와 다른 클래스로 상속되며 확장)
   (classes/base.bbclase 클래스는 묵시적으로 모든 레시피에 상속된다.)
- Configuration(*.conf): 프로젝트의 빌드 프로세스를 통제하는 다양한 구성 변수를 정의
bitbake -c <> <>
# ex)
bitbake -c listtasks core-image-minimal #
bitbake -c fetch busybox #
bitbake -c fetchall core-image-minimal #
태스크
do_fetch, do_unpack, do_patch, do_configure, do_compile, do_install, do_listtasks 등
(do는 빼고 -c 옵션으로 실행)
ex) helloworld 레시피 생성
meta-nova/recipes-local/helloword
                                                        files
                                                            helloworld.c
                                                        helloworld_1.0.bb    ; <패키지 이름>_version.bb
helloworld_1.0.bb
DESCRIPTION="A freindly program that prints Hello World!"
PRIORITY="optional"
SECTION="examples"
LICENSE="GPLv2"
LIC_FILES_CHKSUM="file://${COMMON_LICENSE_DIR}/GPL2.0;
md5=801f80980d171dd6425610833a22dbe6"
SRC_URI="file://helloworld.c"
S="${WORKDIR}"
do_compile(){
${CC} ${CFLAGS} ${LDFLAGS} helloworld.c -o helloworld
}
do_install(){
install -d ${D}${bindir}
install -m 0755 helloworld ${D}${bindir}
}
build
bitbake helloworld
make SDK
bitbake -c populate_sdk <image>
tmp/deploy/sdk 안에 자체 설치(Self installing) 셸 스크립트를 생성한다.
poky-<c_library>-<host_machine>-<target_image><target_machine>-toolchain-<version>.sh
bitbake meta-toolchain # C/C++ compiler and C library and header file